﻿//1706. 球会落何处
//用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。
//箱子中的每个单元格都有一个对角线挡板，跨过单元格的两个角，可以将球导向左侧或者右侧。
//将球导向右侧的挡板跨过左上角和右下角，在网格中用 1 表示。
//将球导向左侧的挡板跨过右上角和左下角，在网格中用 - 1 表示。
//在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 "V" 形图案，或者被一块挡导向到箱子的任意一侧边上，就会卡住。
//返回一个大小为 n 的数组 answer ，其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标，如果球卡在盒子里，则返回 - 1 。

class Solution {
public:
    vector<int> findBall(vector<vector<int>>& grid)
    {
        int n = grid[0].size();

        if (n == 1)    return { -1 };

        auto check = [&](int i, int j)
        {
            //导向左侧
            if (grid[i][j] == -1)
            {
                if (j == 0 || grid[i][j - 1] == 1)
                {
                    return 0;
                }
                return -1;
            }
            //导向右侧
            else
            {
                if (j == n - 1 || grid[i][j + 1] == -1)
                {
                    return 0;
                }
                return 1;
            }
        };

        vector<int> ans(n);
        for (int i = 0; i < n; i++)
        {
            ans[i] = i;
        }
        for (int i = 0; i < grid.size(); i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (ans[j] == -1)  continue;
                int d = check(i, ans[j]);
                if (d == 0) ans[j] = -1;
                if (d == -1) ans[j]--;
                if (d == 1) ans[j]++;
            }
        }
        return ans;
    }
};